/*******************************************************************************************
 *      @name   pthread_create.c
 *      @brief  这是在linux系统下的进程中创建线程的代码案例，目的是学习线程的并发
 *      @date   2025/02/13
 *      @author cecelmx@126.com 
 *      @note
 *              1.线程的创建需要通过pthread_create()函数实现
 *              2.在编译程序的时候，需要指定选项 -pthread
 *              3.线程一旦创建成功，会立刻执行线程的回调函数，回调函数的格式是固定的
 *              4.一般线程创建之后都会执行一个死循环
 *              5.如果没有创建其他线程，则main()就是主线程，如果创建其他线程，其他线程属于子线程
 *              6.利用生产者-消费者模型来实现线程的同步，可以避免竞争条件
 * 
 *      @version  xx.xx.xx   主版本号.次版本号.修正版本号
 * 
 *      CopyRight (c)   2024-2025   Your Name     All Right Reserved
 * 
 * ****************************************************************************************/

#include <time.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

//假设创建子线程用于获取当前系统时间并转化为固定格式的字符串，存储到缓冲区

char timebuf[128] = {0}; //用于记录转化好的系统时间  "2025/2/13 hh:mm:ss"


//构造线程的回调函数 格式是固定的
void *thread_handler(void *arg)
{
    pthread_t tid = *(pthread_t *)arg;

    printf("main thread id = %ld\n",tid);

    //准备接合主线程的资源，pthread_join函数具有阻塞性质的
    int *retval;
    pthread_join(tid,(void **)&retval);

    printf("main thread exit status  = %d\n",*retval);

    for(;;)
    {
        //获取系统时间
        time_t ptime = time(NULL); //以秒为单位

        //转化系统时间
        struct tm *ptm = localtime(&ptime);
        sprintf(timebuf,"date:%d/%d/%d,time:%02d-%02d-%02d",
                                                        ptm->tm_year+1900,
                                                        ptm->tm_mon+1,
                                                        ptm->tm_mday,
                                                        ptm->tm_hour,
                                                        ptm->tm_min,
                                                        ptm->tm_sec                                           
                                                    );
        printf("%s\n",timebuf);

        sleep(1);
    }
    
}


int main()
{
    int retval = 404;                       //用于记录主线程的终止状态
    pthread_t main_tid = pthread_self();    //用于记录主线程的ID
    printf("I am mainthread ,my id = %ld\n",main_tid);
    //1.创建新线程
    pthread_t newthread_id = 0;                //用于记录创建的新线程的ID，可以理解为是线程的句柄

    pthread_create(&newthread_id,NULL,thread_handler,(void *)&main_tid);

    
    //终止线程，就算终止的是主线程，也不会导致进程被终止
    pthread_exit((void *)&retval); 

    return 0;
}

